﻿using System;
using System.Collections.Generic;
using System.Linq;
using Scommesse.Persistence;

namespace Scommesse.Model
{
    [Serializable]
    public class Palinsesto
    {
        private static Palinsesto _instance = null;
        private static List<ICategoria> _categorie;

        private Palinsesto()
        {
            _categorie = new List<ICategoria>();
        }

        public static Palinsesto GetPalinsesto()
        {
            if(_instance==null)
            {
                _instance = new Palinsesto();
                _instance = DataLoader.LoadPalinsestoFromFile();
                return _instance;
            }
            return _instance;
        }

        public List<ICategoria> Categorie
        {
            get { return _categorie; }
        }

        public ICategoria AddCategoria(string nome, params Tipologia[] tipologie)
        {
            if (nome == null) throw new ArgumentNullException("nome");
            if (tipologie == null) throw new ArgumentNullException("tipologie");
            var categoria = new Categoria(nome, tipologie);
            if (_categorie.Contains(categoria))
                throw new ArgumentException("esiste già una categoria con quel nome");
            _categorie.Add(categoria);
            return categoria;
        }

        public void RemoveCategoria(string nome)
        {
            _categorie.Remove(GetCategoriaByName(nome));
        }

        public ICategoria GetCategoriaByName(string nome)
        {
            if (nome == null) throw new ArgumentNullException("nome");
            return _categorie.FirstOrDefault(cat => (cat.Nome).Equals(nome));
        }

        public List<IEvento> GetAllEventi()
        {
            return
                (from cat in Categorie
                 from comp in cat.Competizioni
                 from evento in comp.Eventi
                 select evento).ToList();
        }

        public IEvento GetEventoById(Guid eventoGuid)
        {
            foreach(Categoria cat in Categorie)
                foreach(Competizione comp in cat.Competizioni)
                    foreach (Evento evento in comp.Eventi)
                        if (evento.Id.Equals(eventoGuid))
                            return evento;
                    
            return null;
        }
    }
}